home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
misc
/
emu
/
QDOS2.lha
/
QLsource
/
ROMsrc
/
SYS
/
STARTUP_asm
< prev
next >
Wrap
Text File
|
1995-05-14
|
6KB
|
221 lines
*/beginfile STARTUP_asm
; --------------------------------------------------------------
; STARTUP_asm - startup routines
; - last modified 15/05/95
; QDOS-Amiga sources by Rainer Kowallik
; ...some changes by Mark J Swift
; --------------------------------------------------------------
;*/beginoverlay
; --------------------------------------------------------------
; Target for Jumps to reset the system
RST_SYS:
SYS_STARt:
QL_START:
; clear QL screen
lea $20000,a0
move.w #$1FFF,d0
CLR_SCR:
clr.l (a0)+
dbra d0,CLR_SCR
;
dc.l $2E780000 ; move.l $0,a7 Get SSP !A68k
move.l a7,d0 ; Calculate start of
andi.w #-$8000,d0 ; system variables
move.l d0,a6
; set system system stack and lomem
lea $480(a6),a7 ; Set SSP.
move.l a7,a4 ; Set lomem.
cmpi.w #SV.IDENT,(a6) ; Check if sys vars exist
bne.s QDOS256K
; get himem from system variables
move.l SV_RAMT(a6),a5 ; Get ramtop.
cmpa.l a4,a5 ; use only if valid
bgt.s CLR_VAR
; if lomem and himem not valid, can only assume a minimum system
QDOS256K:
move.l a0,a6 ; Put sys vars after scrn#1
lea $480(a6),a7 ; Set SSP.
move.l a7,a4 ; Set lomem.
lea $60000,a5 ; Set ramtop
; clear system variables.
CLR_VAR:
move.l a6,a0 ; Start of memory to clear.
CLR_VMEM:
clr.l (a0)+
cmpa.l a7,a0
bne.s CLR_VMEM
; clear system memory, lomem to himem
;CLR_SYS:
; move.l a4,a0 ; Get start of ram.
;CLR_SMEM:
; clr.l (a0)+
; cmpa.l a5,a0 ; Clear until end of ram.
; bne.s CLR_SMEM
; initialise QL hardware registers
move.b #$8,MC_STAT ; 8 colour mode, screen #1
; initialise system variables.
INISYVAR:
move.w #SV.IDENT,(a6) ; Store QDOS id.
bsr SET_ATTN ; check processor type
bsr CLRALL ; clear data & instr caches
move.l a5,SV_RAMT(a6) ; Store ramtop
move.l a5,SV_RESPR(a6) ; base of resident procs
move.l a5,SV_TRNSP(a6) ; base of transient progs
move.b #-$40,SV_PCINT(a6) ; Current value for PC
; interrupt flag.
; initialise pointers to slave blocks.
move.l a5,d0 ; Top of ram.
bsr.s SLVTBL_LEN ; Max len of slave blk table
move.l a7,a2 ; First byte after sys vars
lea SV_BTPNT(a6),a3 ; Address of ptr to most
; recent slave block.
moveq #0,d6
bsr.s INI_TABLE ; Initialise pointers to
; slave blocks.
; find combined length of job and channel tables.
move.l a5,a0 ; Get himem.
suba.l a4,a0 ; subtract lomem
move.l a0,d0 ; Tables are at most 1/128th
lsr.l #7,d0 ; the size of available ram
addi.l #$80,d0 ; ...but big enough for at
; least 8 jobs.
bsr.s LIMIT_TBLS ; Limit table size to 120
; jobs and 360 channels.
; tables must finish on a 512 byte boundary
add.l a2,d0 ; Make sure tables finish
addi.l #$1FF,d0 ; on a 512 byte boundary
andi.w #-$200,d0 ; by tweaking the combined
sub.l a2,d0 ; length of channel and job
move.l d0,d1 ; tables. Length in d0 & d1
bsr.s LIMIT_TBLS ; no more than 120 jobs.
lsr.l #2,d0 ; New length of job table
sub.l d0,d1 ; New length of channel tbl
move.l a2,a0 ; Save start of job table.
;
moveq #-$1,d6
clr.w d6
lsl.l #$8,d6 ; d6 = FF00 0000
; initialise job table.
bsr.s INI_TABLE
; initialise channel table.
move.l d1,d0
bsr.s INI_TABLE
;
bra.s LOW_USE
; subroutine to limit the combined lengths of job and channel
; tables to to that required for 120 jobs and 360 channels.
LIMIT_TBLS:
moveq #$78,d6
lsl.l #4,d6 ; move.l #$780,d6
cmp.l d6,d0
bls.s X_LIMIT
move.l d6,d0
X_LIMIT:
rts
; subroutine to return the maximum length of the slave block
; table given d0 as himem.
SLVTBL_LEN:
addi.l #$1FF,d0
; subroutine to find how far into the slave tables, the entry
; for memory address d0 is.
SLVTBL_POS:
sub.l a6,d0 ; Slave blocks start at the
andi.w #-$200,d0 ; sys vars and are each 512
lsr.l #6,d0 ; bytes long. Each table
rts ; entry is 8 bytes long.
; subroutine to set slave, job or channel pointers.
INI_TABLE:
move.l a2,(a3)+ ; Current entry.
move.l a2,(a3)+ ; Start of table.
lea 0(a2,d0.l),a0
INI_TBL1:
move.l d6,(a2)+
cmpa.l a0,a2
blt.s INI_TBL1
move.l a2,(a3)+ ; End of table.
addq.l #4,a3
rts
; continue by finding the lowest usable address.
LOW_USE:
cmpa.l a4,a2 ; which is greater, lomem
bgt.s SET_LOW ; or top of channel table?
move.l a4,a2
SET_LOW:
move.l a2,SV_CHEAP(a6) ; Set base of common heap.
move.l a2,SV_FREE(a6) ; Set base of free area.
; find usable entries in the slave block table.
move.l a2,d0 ; Find how many are used up
bsr.s SLVTBL_LEN ; by the tables themselves
move.l d0,a2 ; Address of first free
adda.l a7,a2 ; entry in ->a2.
move.l a5,a3 ; clear 512 bytes between
moveq #$7F,d0 ; RAMTOP and base of BASIC
; stack
CLRBASLUP:
clr.l -(a3)
dbra d0,CLRBASLUP
move.l a3,SV_BASIC(a6) ; address of BASIC stack.
move.l a3,d0 ; Find address of first
bsr.s SLVTBL_POS ; entry made unusable by
move.l d0,a3 ; BASIC stack in ->a3.
adda.l a7,a3
move.l a2,d0 ; Set SV.BTPNT half way
add.l a3,d0 ; between the first unused
lsr.l #4,d0 ; entry and the last, but
lsl.l #3,d0 ; must be divisible by 8.
move.l d0,SV_BTPNT(a6) ; Store most recent block.
; initialise slave table entries.
moveq #$1,d0
ror.l #$8,d0 ; d0 = %0100 0000
SLV_INIT:
move.l d0,(a2)+ ; Put 0100 0000 0000 0000
clr.l (a2)+ ; into entries for usable
cmpa.l a3,a2 ; blocks.
blt.s SLV_INIT
lea BAS_STARt(pc),a1
LEA SHLST(PC),A5
MOVE.L A5,SV_SHLST(A6) ; pointer to list of
; scheduler tasks
LEA DRLST(PC),A5
MOVE.L A5,SV_DRLST(A6) ; pointer to list of device
; drivers
ADDQ.B #1,SV_NETNR(A6) ; network station number
ADDQ.B #8,SV_MCSTA(A6) ; current value of MC status
; register
MOVE.W #$1E,SV_ARDEL(A6) ; auto repeat delay
ADDQ.W #2,SV_ARFRQ(A6) ; autorepeat 1/freq.
ADDQ.W #3,SV_CQCH(A6) ; ctrl. C
MOVE.L #(MSG_LIST-ORG0),SV_MGTAB(A6) ; sys messages
MOVE.L #(KEY_TRA-ORG0),SV_TRTAB(A6) ; key trnslation
; Initialise BASIC
MOVEA.L SV_JBBAS(A6),A4 ; pointer to base of Job
; table
MOVE.L A4,SV_JBPNT(A6) ; pointer to current Job
; table entry
MOVEA.L SV_TRNSP(A6),A3 ; base of transient program
; area
CLR.L -(A3)
MOVEA.L SV_BASIC(A6),A0 ; base of basic stack
MOVE.L A0,(A4) ; address of job 0: BASIC
MOVE.B #$20,JB_PRINC(A0) ; BASIC's priority increment
MOVE.L A3,USP
LEA JB_END(A0),A6
MOVEA.L A3,A5
SUBA.L A6,A5 ; A5 = Basic area
move.w #0,SR ; user mode on
jmp (a1) ; start BASIC interpreter
;*/endoverlay
; --------------------------------------------------------------
;*/endfile